package com.itheima.d5_synchronized_method;

/**
 * 目标：模拟线程安全问题。
 *
 * 同步方法
 * 作用：把访问共享资源的核心方法给上锁，以此保证线程安全。
 * 修饰符 synchronized 返回值类型 方法名称(形参列表) {
 * 操作共享资源的代码
 * }
 * 原理：每次只能一个线程进入，执行完毕以后自动解锁，其他线程才可以进来执行。
 *
 * 同步方法底层原理
 * 同步方法其实底层也是有隐式锁对象的，看不到，也不需要自己写，和同步代码块是类似的，只是锁的范围是整个方法代码。
 * 如果方法是实例方法：同步方法默认用this作为的锁对象。
 * 如果方法是静态方法：同步方法默认用类名.class作为的锁对象。
 *
 * 1、是同步代码块好还是同步方法好一点？
 * 范围上：同步代码块锁的范围更小，同步方法锁的范围更大。
 *        锁的范围越小，其实它的性能越好
 * 可读性：同步方法更好。
 */
public class ThreadTest {
    public static void main(String[] args) {
        Account acc = new Account("ICBC-110", 100000);
        new DrawThread(acc, "小明").start(); // 小明
        new DrawThread(acc, "小红").start(); // 小红
    }
}
